package com.hina.rec.common.utils;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

/**
 * 处理workflow日期字段
 *
 * @author gengkeke
 * @since 2025/4/9
 */
public class CustomDateDeserializer extends JsonDeserializer<LocalDateTime> {
    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String date = p.getText();
        if (date == null || date.isEmpty()) {
            return null;
        }
        
        try {
            // 处理带T的ISO格式
            if (date.contains("T")) {
                if (date.contains("+") || date.contains("Z")) {
                    // 处理带时区的格式 (包括带毫秒和不带毫秒)
                    try {
                        // 尝试直接解析为OffsetDateTime
                        OffsetDateTime offsetDateTime = OffsetDateTime.parse(date);
                        return offsetDateTime.atZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime();
                    } catch (DateTimeParseException e) {
                        // 尝试解析为自定义格式
                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
                        OffsetDateTime offsetDateTime = OffsetDateTime.parse(date, formatter);
                        return offsetDateTime.atZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime();
                    }
                } else {
                    // 处理不带时区的ISO格式
                    return LocalDateTime.parse(date, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
                }
            } else {
                // 处理标准格式 yyyy-MM-dd HH:mm:ss
                return LocalDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            }
        } catch (DateTimeParseException e) {
            // 记录详细错误并重新抛出
            throw new IOException("无法解析日期时间: " + date + ", 错误: " + e.getMessage(), e);
        }
    }
} 